package vip.liux.backend.application.service.product;

import vip.liux.application.dots.ListResultDto;
import vip.liux.application.dots.PagedResultDto;
import vip.liux.contracts.shared.enums.Status;

import java.util.List;

/**
 * 商品服务接口
 * 定义商品相关的操作方法
 */
public interface ProductService {

    /**
     * 保存商品信息
     *
     * @param input 商品保存请求数据
     * @return 保存后的商品实体
     */
    ProductSpuDto save(CreateProductDto input);

    /**
     * 分页查询商品列表
     *
     * @param input 分页请求参数
     * @return 分页结果
     */
    PagedResultDto<ProductSpuDto> pageList(QueryProductDto input);

    /**
     * 根据 SPU 查询商品信息
     *
     * @param spu 商品 SPU 编码
     * @return 商品 SPU 数据传输对象
     */
    ProductSpuDto detail(String spu);

    /**
     * 根据 SKU 查询商品信息
     *
     * @param sku 商品 SKU 编码
     * @return 商品 SKU 数据传输对象
     */
    ProductSkuDto detailBySku(String sku);

    /**
     * 更新商品信息
     *
     * @param spu 商品 SPU 编码
     * @param dto 商品更新请求数据
     * @return 更新后的商品实体
     */
    ProductSpuDto update(String spu, CreateProductDto dto);

    void delete(List<String> spuList);

    void status(List<String> spuList, Status status);

    /**
     * 分页查询商品 SKU 列表
     *
     * @param input 分页请求参数
     * @return 分页结果
     */
    PagedResultDto<ProductSkuDto> skuList(QueryProductDto input);

    /**
     * 查询商品 SKU 列表
     *
     * @param skuList sku 集合
     * @return 列表结果
     */
    ListResultDto<ProductSkuDto> listBySku(List<String> skuList);

    interface CheckOccupied {
        /**
         * 检查商品是否被占用
         *
         * @param spu 商品 SPU 编码
         * @return 是否被占用
         */
        boolean isOccupied(String spu);
    }
}